{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 14\n",
    "\n",
    "# 求和符号\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ce08405-13f6-402f-a15d-56396c211cbd",
   "metadata": {},
   "source": [
    "这段代码的目的是生成一个随机矩阵 $a_{i,j}$，然后分别绘制该矩阵的值、矩阵按行求和以及按列求和的热力图。具体来说，代码分为以下几个步骤：\n",
    "\n",
    "1. **定义热力图绘制函数**：函数`heatmap_sum`使用`seaborn`库中的`heatmap`函数绘制热力图。该函数接受数据矩阵 `data`，行、列索引数组 `i_array` 和 `j_array` 以及图表标题 `title` 作为参数。`heatmap`函数会将矩阵的每个元素以颜色块的形式展示在图中，不同颜色表示不同数值范围。\n",
    "\n",
    "2. **生成随机矩阵**：首先通过设置随机种子（`np.random.seed(0)`）保证每次运行得到的随机矩阵一致。定义矩阵大小为 $8 \\times 12$，即行数 $n = 8$ 和列数 $m = 12$，矩阵元素符合正态分布，均值为 0，标准差为 1。生成的矩阵表示为 $a_{i,j}$，其中 $i$ 和 $j$ 分别表示行和列索引。\n",
    "\n",
    "3. **绘制矩阵 $a_{i,j}$ 的热力图**：通过调用`heatmap_sum`，将矩阵 $a_{i,j}$ 的值可视化，显示其元素值的分布。图中，横轴和纵轴分别表示列索引 $j$ 和行索引 $i$。\n",
    "\n",
    "4. **按行求和**：代码通过矩阵乘法实现对矩阵 $a_{i,j}$ 的行求和。为了实现这一点，构造一个 $8 \\times 1$ 的全1列向量 `all_1`，将其转置后与矩阵 $a_{i,j}$ 相乘，即 $all\\_1^T \\cdot a_{i,j}$。这一操作将每一列的所有行相加，得到一个 $1 \\times 12$ 的向量，其第$j$项表示：\n",
    "\n",
    "   $$\n",
    "   \\sum_{i=1}^{n} a_{i,j}\n",
    "   $$\n",
    "\n",
    "   生成的结果是一维向量，表示每一列的总和。\n",
    "\n",
    "5. **按列求和**：同样地，创建一个 $12 \\times 1$ 的全1列向量，通过矩阵乘法 $a_{i,j} \\cdot all\\_1$ 对每一行的所有列相加，得到一个 $8 \\times 1$ 的向量。其第$i$项表示：\n",
    "\n",
    "   $$\n",
    "   \\sum_{j=1}^{m} a_{i,j}\n",
    "   $$\n",
    "\n",
    "   此结果展示了矩阵每一行的总和。\n",
    "\n",
    "6. **可视化部分求和结果**：代码依次调用`heatmap_sum`函数，将按行求和和按列求和的结果分别可视化为热力图。这样便于观察矩阵在行或列方向上的累积变化。\n",
    "\n",
    "通过热力图的展示方式，用户可以直观地看到原始矩阵元素的分布以及在行、列方向上的累积求和结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "807d279b-1500-431b-a40f-663ed1c60f9a",
   "metadata": {},
   "source": [
    "## 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9768c4da-6c29-4d36-872a-57a782874382",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e684548c-aa5c-45a8-a7b5-9251ab8fd2b9",
   "metadata": {},
   "source": [
    "## 定义绘制热力图的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "96a86f37-a625-4d47-89e7-32876883449a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def heatmap_sum(data, i_array, j_array, title):\n",
    "    # 创建绘图窗口和坐标轴\n",
    "    fig, ax = plt.subplots(figsize=(10, 10))\n",
    "    \n",
    "    # 使用seaborn绘制热力图，颜色映射为'RdYlBu_r'\n",
    "    ax = sns.heatmap(data, cmap='RdYlBu_r',\n",
    "                     cbar_kws={\"orientation\": \"horizontal\"},\n",
    "                     yticklabels=i_array, xticklabels=j_array,\n",
    "                     ax=ax)\n",
    "    ax.set_xlabel('Index, $j$')  # 设置x轴标签\n",
    "    ax.set_ylabel('Index, $i$')  # 设置y轴标签\n",
    "    \n",
    "    ax.set_aspect(\"equal\")  # 保持坐标轴比例一致\n",
    "    plt.title(title)  # 设置图表标题\n",
    "    plt.yticks(rotation=0)  # y轴刻度不旋转"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b2186c3-43d1-4f96-83ed-2995cdb5608a",
   "metadata": {},
   "source": [
    "## 数据初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f2da4f21-a7c2-41e8-8ef0-2dd626bc6702",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(0)  # 设置随机种子，确保结果可重复\n",
    "\n",
    "m = 12  # 列数（对应j的取值范围1到m）\n",
    "n = 8   # 行数（对应i的取值范围1到n）\n",
    "\n",
    "j_array = np.arange(1, m + 1)  # 列索引\n",
    "i_array = np.arange(1, n + 1)  # 行索引\n",
    "\n",
    "jj, ii = np.meshgrid(j_array, i_array)  # 创建网格坐标\n",
    "\n",
    "a_ij = np.random.normal(loc=0.0, scale=1.0, size=(n, m))  # 生成随机数矩阵，表示$a_{i,j}$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6f1684b-d8b7-469d-bf97-da0f2c3fd2bd",
   "metadata": {},
   "source": [
    "## 绘制矩阵 $a_{i,j}$ 的热力图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9bdf829b-76c4-44cb-b7d9-d0bc6266f043",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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9rc488wz45ZbbonNNttsvT6mqqoqKisrG7z89PGXmngpAADQnJREEM2ZMyeWLl0ae+21V7Rs2TJatmwZM2fOjJ///OfRsmXLWL169RofM3bs2KipqWnwcs5/bJ9gPQAAsKkqiYfMffGLX4z58+c3ODZy5MjYZZdd4rzzzovy8vI1PqaioiIqKioaHHvfw+UAAIANUBJB1L59++jbt2+DY23bto1OnTqtcRwAAKCxuKQCAABkqySuEK3NjBkzUk8AAACaOVeIAACAbAkiAAAgW4IIAADI1gYF0fDhw+ODDz6IiH/+MVUAAIBN2QY9qUK7du2itrY22rRpEz179owtt9wy+vfvH/3794899tgj+vfvH3369IlWrVo11V4AAIBGs0FBdO2119a/vmjRoqiuro558+ZFdXV13HPPPfHXv/41WrZsGbvsskvMmzev0ccCAAA0po1+2u2ePXtGz54944gjjqg/9u6770Z1dXU8/fTTjTIOAACgKTXq3yFq37597L///rH//vs35s0CAAA0Cc8yBwAAZEsQAQAA2RJEAABAtgQRAACQLUEEAABkq0mCqEWLFvGFL3wh5syZ0xQ3DwAA0CiaJIh++ctfxoEHHhhnnHFGU9w8AABAo2jUv0P0kZNPPjkiIsaNG9cUNw8AANAoNvoK0YMPPrjO91133XUbe7MAAABFs9FBNHTo0PjOd74TK1eurD/25ptvxrBhw2Ls2LGNMg4AAKApbXQQPfroo/G73/0u9t5771iwYEH84Q9/iL59+8Z7770X8+bNa8yNAAAATWKjg2ifffaJp556Kvr16xd77bVXHHXUUfGd73wnHn744dh2220bcyMAAECT+EzPMrdw4cKYNWtWbLPNNtGyZct47rnn4v3332+sbQAAAE1qo4NowoQJMXDgwDj00EPjL3/5S8yaNav+itGf//znxtwIAADQJDY6iK666qq4++674+qrr47NNtss+vTpE08++WQcffTRcdBBBzXiRAAAgKax0X+HaP78+bHVVls1ONaqVau47LLL4vDDD//MwwAAAJraRl8h+vcY+rgDDzxwY28WAACgaD7Tkyr88Y9/jOHDh8fAgQPj1VdfjYiIm2++OR577LFGGQcAANCUNjqI7rzzzvjSl74Ubdq0iaeeeipqa2sjIuLdd9+N8ePHN9pAAACAplJWKBQKG/OBe+65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IuKYY45JvKw4fvKTn8S1114bEydOjGeffTYuvfTSuOyyy+Lqq69OPa2oTj311Jg+fXrcfPPNMX/+/Bg8eHAccsgh8eqrr6ae1ug+7eefSy+9NK644oqYOHFizJo1K7p27RqHHnpovPvuu0Ve2nQ+7T5Yvnx57LvvvjFhwoQiLyueT7oP3n///Zg7d2784Ac/iLlz58Zdd90Vzz//fHzlK19JsPQTFGhUEVGYNm1a6hlJLV26tBARhZkzZ6aeksyWW25Z+MUvfpF6RlG9++67hR133LEwffr0woEHHlg488wzU08qmnHjxhX69++fekZS5513XmG//fZLPaOknHnmmYXtt9++UFdXl3pKUQwdOrQwatSoBseOPvrowvDhwxMtKr7333+/UF5eXvj973/f4Hj//v0LF1xwQaJVxfHvP//U1dUVunbtWpgwYUL9sRUrVhQqKysL1157bYKFTe+TfgZctGhRISIKTz31VFE3Fdv6/Bz85JNPFiKisHjx4uKMWg+uENHoampqIiKiY8eOiZcU3+rVq+P222+P5cuXx8CBA1PPKarRo0fH0KFD45BDDkk9JYkXXnghunfvHr169Yrjjz8+Xn755dSTiuqee+6JAQMGxDHHHBOdO3eOPffcM66//vrUs5JZuXJl3HLLLTFq1KgoKytLPaco9ttvv3jooYfi+eefj4iIefPmxWOPPRaHHXZY4mXFs2rVqli9enVsttlmDY63adMmHnvssUSr0li0aFG8/vrrMXjw4PpjFRUVceCBB8af/vSnhMtIraamJsrKykrqEQQtUw+geSkUCjFmzJjYb7/9om/fvqnnFM38+fNj4MCBsWLFimjXrl1MmzYtdtttt9Sziub222+PuXPnNtvHyX+affbZJ2666abYaaed4o033oiLL744Bg0aFAsWLIhOnTqlnlcUL7/8ckyaNCnGjBkT559/fjz55JNxxhlnREVFRZx00kmp5xXd3XffHe+8806cfPLJqacUzXnnnRc1NTWxyy67RHl5eaxevTouueSSOOGEE1JPK5r27dvHwIED48c//nHsuuuu0aVLl7jtttviiSeeiB133DH1vKJ6/fXXIyKiS5cuDY536dIlFi9enGISJWDFihXxve99L772ta9Fhw4dUs+pJ4hoVKeddlo8/fTT2f1L2M477xzV1dXxzjvvxJ133hkjRoyImTNnZhFFf/vb3+LMM8+MBx54YI1/Fc3FkCFD6l/ffffdY+DAgbH99tvH1KlTY8yYMQmXFU9dXV0MGDAgxo8fHxERe+65ZyxYsCAmTZqUZRDdcMMNMWTIkOjevXvqKUVzxx13xC233BK33npr9OnTJ6qrq+Oss86K7t27x4gRI1LPK5qbb745Ro0aFZ/73OeivLw8Pv/5z8fXvva1mDt3buppSfz7FdJCoZDNVVMa+vDDD+P444+Purq6uOaaa1LPaUAQ0WhOP/30uOeee+LRRx+NbbbZJvWcomrdunXssMMOERExYMCAmDVrVlx11VVx3XXXJV7W9ObMmRNLly6Nvfbaq/7Y6tWr49FHH42JEydGbW1tlJeXJ1xYfG3bto3dd989XnjhhdRTiqZbt25r/APArrvuGnfeeWeiReksXrw4HnzwwbjrrrtSTymqc889N773ve/F8ccfHxH//MeBxYsXR1VVVVZBtP3228fMmTNj+fLlsWzZsujWrVscd9xx0atXr9TTiuqjZ9p8/fXXo1u3bvXHly5dusZVI5q/Dz/8MI499thYtGhRPPzwwyV1dSjCs8zRCAqFQpx22mlx1113xcMPP5zdf/TXplAoRG1tbeoZRfHFL34x5s+fH9XV1fUvAwYMiBNPPDGqq6uzi6GIiNra2nj22Wcb/BDQ3O27775rPN3+888/Hz179ky0KJ0pU6ZE586dY+jQoamnFNX7778fLVo0/LGivLw8u6fd/kjbtm2jW7du8fbbb8f9998fRxxxROpJRdWrV6/o2rVr/bMtRvzzd+tmzpwZgwYNSriMYvsohl544YV48MEHS/Kh5K4QNYL33nsvXnzxxfq3Fy1aFNXV1dGxY8fo0aNHwmXFMXr06Lj11lvjt7/9bbRv377+ccOVlZXRpk2bxOua3vnnnx9DhgyJbbfdNt599924/fbbY8aMGXHfffelnlYU7du3X+P3xdq2bRudOnXK5vfIzjnnnBg2bFj06NEjli5dGhdffHEsW7Ysq38VP/vss2PQoEExfvz4OPbYY+PJJ5+MyZMnx+TJk1NPK6q6urqYMmVKjBgxIlq2zOv/YocNGxaXXHJJ9OjRI/r06RNPPfVUXHHFFTFq1KjU04rq/vvvj0KhEDvvvHO8+OKLce6558bOO+8cI0eOTD2t0X3azz9nnXVWjB8/PnbcccfYcccdY/z48bH55pvH1772tYSrG9en3Qf/+Mc/YsmSJfV/d+ejfzjq2rVrs/l7dZ90H3Tv3j2++tWvxty5c+P3v/99rF69uv7nxI4dO0br1q1TzW4o6XPcNROPPPJIISLWeBkxYkTqaUWxtq89IgpTpkxJPa0oRo0aVejZs2ehdevWha233rrwxS9+sfDAAw+knpVUbk+7fdxxxxW6detWaNWqVaF79+6Fo48+urBgwYLUs4rud7/7XaFv376FioqKwi677FKYPHly6klFd//99xciorBw4cLUU4pu2bJlhTPPPLPQo0ePwmabbVbo3bt34YILLijU1tamnlZUd9xxR6F3796F1q1bF7p27VoYPXp04Z133kk9q0l82s8/dXV1hXHjxhW6du1aqKioKBxwwAGF+fPnpx3dyD7tPpgyZcpa3z9u3LikuxvTJ90HHz3d+NpeHnnkkdTT65UVCoVCUwYXAABAqfI7RAAAQLYEEQAAkC1BBAAAZEsQAQAA2RJEAABAtgQRAACQLUEEAABkSxABAADZEkQAAEC2BBEAm5yDDjoozjrrrCSf+9xzz43DDz88yecGoPG1TD0AgLycfPLJ8c4778Tdd9+despGueCCC6K8vDz1DAAaiSACgA2wxRZbpJ4AQCPykDkAkjrooIPijDPOiO9+97vRsWPH6Nq1a1x44YX171++fHmcdNJJ0a5du+jWrVtcfvnla9xGoVCISy+9NHr37h1t2rSJ/v37x29+85v697/55pvRtWvXGD9+fP2xJ554Ilq3bh0PPPDAem996623oqysLBYsWLBxXywAJUcQAZDc1KlTo23btvHEE0/EpZdeGhdddFFMnz49Iv75OzuPPPJITJs2LR544IGYMWNGzJkzp8HHf//7348pU6bEpEmTYsGCBXH22WfH8OHDY+bMmRERsfXWW8cvf/nLuPDCC2P27Nnx3nvvxfDhw+Pb3/52DB48eL13zps3LyoqKmLnnXduvC8egKQ8ZA6A5Pr16xfjxo2LiIgdd9wxJk6cGA899FAMHDgwbrjhhrjpppvi0EMPjYh/xtM222xT/7HLly+PK664Ih5++OEYOHBgRET07t07HnvssbjuuuviwAMPjIiIww47LP7rv/4rTjzxxNh7771js802iwkTJmzQznnz5kWfPn2iZUv/9wnQXPgvOgDJ9evXr8Hb3bp1i6VLl8ZLL70UK1eurA+diIiOHTs2uELzzDPPxIoVK+qD6SMrV66MPffcs8Gxn/70p9G3b9/41a9+FbNnz47NNttsg3ZWV1fHHnvssUEfA0BpE0QAJNeqVasGb5eVlUVdXV0UCoVP/di6urqIiPjDH/4Qn/vc5xq8r6KiosHbL7/8crz22mtRV1cXixcvXiPEPs28efPilFNO2aCPAaC0CSIAStYOO+wQrVq1iscffzx69OgRERFvv/12PP/88/UPhdttt92ioqIilixZUn9sbVauXBknnnhiHHfccbHLLrvEKaecEvPnz48uXbqs15YPP/wwnn322ejfv/9n/8IAKBmCCICS1a5duzjllFPi3HPPjU6dOkWXLl3iggsuiBYt/vWcQO3bt49zzjknzj777Kirq4v99tsvli1bFn/605+iXbt2MWLEiIj4598PqqmpiZ///OfRrl27uPfee+OUU06J3//+9+u15ZlnnokPP/xQEAE0M4IIgJJ22WWXxXvvvRdf+cpXon379vGd73wnampqGpzz4x//ODp37hxVVVXx8ssvxxZbbBGf//zn4/zzz4+IiBkzZsSVV14ZjzzySHTo0CEiIm6++ebo169fTJo0Kb71rW/FjTfeGCNHjlznw/Sqq6ujZ8+e/g4RQDNTVlifB2gDQDN34YUXxowZM2LGjBlrff9pp50WS5cujV/96lfFHQZAk/J3iAAgIu6///649NJL1zi+YsWKmDt3btx5553xpS99KcEyAJqSK0QA8AkmTJgQV199dXzlK1+Jn//852s8Ix4AmzZBBAAAZMtD5gAAgGwJIgAAIFuCCAAAyJYgAgAAsiWIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBsCSIAACBbgggAAMiWIAIAALIliAAAgGwJIgAAIFuCCAAAyJYgAgAAsiWIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBsCSIAACBbgggAAMiWIAIAALIliAAAgGwJIgAAIFuCCAAAyJYgAgAAsiWIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBsCSIAACBbgggAAMiWIAIAALIliAAAgGwJIgAAIFuCCAAAyJYgAgAAsiWIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBsCSIAACBbgggAAMiWIAIAALIliAAAgGwJIgAAIFuCCAAAyJYgAgAAsiWIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBsCSIAACBbgggAAMiWIAIAALIliAAAgGwJIgAAIFuCCAAAyJYgAgAAsiWIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBstUw9oDF9fp9r6l8va1H2r9fL//V6tGix1uONdf7Hj0d5w95cn49Z5+fewM+3oZ+r7GOfq8XHzmmxjvPXdU7D1z92m+v42LL1uZ11ft61f73r97Hr2rP2zev78S3K1n68fAPPb/j6vzaUr8/563FO+QZv2MCvcZ23GWs/p2xdx9d+Tvl6fOz6f44N+9zrc7y8CW6zLOr+9XrZv15vEavXeryxzi/72PktNvD8hp93wz72s36+ssK/Xo91vl5Y+/G69fnYdZ2/jtv82OuF9fpcn34767ezsGHn163P6+u4zfX++PW4rbr1uL828HaaYluDnas/fv7HXv/Y8cI6jsfquk8/52PHG36uurWev+7PtY5zPvOODft6Cuu4nY8fr1vX+eu439frNtfjnHXfzqd/3vW6/Q38vHUNbj/W+voa72uK/0ms8z97n76viP9TbPD61woLY324QgQAAGRLEAEAANkSRAAAQLYEEQAAkC1BBAAAZEsQAQAA2RJEAABAtgQRAACQLUEEAABkSxABAADZEkQAAEC2BBEAAJAtQQQAAGRLEAEAANkSRAAAQLYEEQAAkC1BBAAAZEsQAQAA2RJEAABAtgQRAACQLUEEAABkSxABAADZEkQAAEC2BBEAAJAtQQQAAGRLEAEAANkSRAAAQLYEEQAAkC1BBAAAZEsQAQAA2RJEAABAtgQRAACQLUEEAABkSxABAADZEkQAAEC2BBEAAJAtQQQAAGSrrFAoFFKPYNNQW1sbVVVVMXbs2KioqEg9hwz5HiQl33+k5nuQ1Jrr96AgYr0tW7YsKisro6amJjp06JB6DhnyPUhKvv9IzfcgqTXX70EPmQMAALIliAAAgGwJIgAAIFuCiPVWUVER48aNa1a/RMemxfcgKfn+IzXfg6TWXL8HPakCAACQLVeIAACAbAkiAAAgW4IIAADIliACAACyJYgAAIBsCSI22F//+tc45ZRTolevXtGmTZvYfvvtY9y4cbFy5crU08jIJZdcEoMGDYrNN988tthii9RzyMA111wTvXr1is022yz22muv+OMf/5h6Epl49NFHY9iwYdG9e/coKyuLu+++O/UkMlJVVRV77713tG/fPjp37hxHHnlkLFy4MPWsRiWI2GDPPfdc1NXVxXXXXRcLFiyIn/3sZ3HttdfG+eefn3oaGVm5cmUcc8wx8a1vfSv1FDJwxx13xFlnnRUXXHBBPPXUU7H//vvHkCFDYsmSJamnkYHly5dH//79Y+LEiamnkKGZM2fG6NGj4/HHH4/p06fHqlWrYvDgwbF8+fLU0xqNv0NEo7jsssti0qRJ8fLLL6eeQmZuvPHGOOuss+Kdd95JPYVmbJ999onPf/7zMWnSpPpju+66axx55JFRVVWVcBm5KSsri2nTpsWRRx6ZegqZevPNN6Nz584xc+bMOOCAA1LPaRSuENEoampqomPHjqlnADS6lStXxpw5c2Lw4MENjg8ePDj+9Kc/JVoFkEZNTU1ERLP6uU8Q8Zm99NJLcfXVV8c3v/nN1FMAGt1bb70Vq1evji5dujQ43qVLl3j99dcTrQIovkKhEGPGjIn99tsv+vbtm3pOoxFE1LvwwgujrKzsE19mz57d4GNee+21+PKXvxzHHHNMnHrqqYmW01xszPcgFEtZWVmDtwuFwhrHAJqz0047LZ5++um47bbbUk9pVC1TD6B0nHbaaXH88cd/4jnbbbdd/euvvfZaHHzwwTFw4MCYPHlyE68jBxv6PQjFsNVWW0V5efkaV4OWLl26xlUjgObq9NNPj3vuuSceffTR2GabbVLPaVSCiHpbbbVVbLXVVut17quvvhoHH3xw7LXXXjFlypRo0cLFRj67DfkehGJp3bp17LXXXjF9+vQ46qij6o9Pnz49jjjiiITLAJpeoVCI008/PaZNmxYzZsyIXr16pZ7U6AQRG+y1116Lgw46KHr06BE//elP480336x/X9euXRMuIydLliyJf/zjH7FkyZJYvXp1VFdXR0TEDjvsEO3atUs7jmZnzJgx8fWvfz0GDBhQf1V8yZIlfneSonjvvffixRdfrH970aJFUV1dHR07dowePXokXEYORo8eHbfeemv89re/jfbt29dfLa+srIw2bdokXtc4PO02G+zGG2+MkSNHrvV9vp0olpNPPjmmTp26xvFHHnkkDjrooOIPotm75ppr4tJLL42///3v0bdv3/jZz37WbJ5yltI2Y8aMOPjgg9c4PmLEiLjxxhuLP4isrOt3JadMmRInn3xyccc0EUEEAABkyy9+AAAA2RJEAABAtgQRAACQLUEEAABkSxABAADZEkQAAEC2BBEAAJAtQQQAAGRLEAEAANkSRAAAQLYEEQAAkK3/H6mSFRv6zzapAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x1000 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "title = '$a_{i,j}$'  # 图表标题\n",
    "heatmap_sum(a_ij, i_array, j_array, title)  # 调用热力图绘制函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c72065c8-8a25-4e10-b1af-288ab5730831",
   "metadata": {},
   "source": [
    "## 对矩阵 $a_{i,j}$ 按行进行部分求和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "21d33506-6434-4c72-ae86-99359213635a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0QAAALaCAYAAAARApOpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5tklEQVR4nO3de5TUdf348dew4LLCsgqGQAbiJRQQEPD4w7vfFEMyL9/wkiQI+tVEA0nzVkmGrGmZqUcUS0LNsELNLBK8oVYqcg8SRA1vKZoICLEIO78/Om5ugHLZnc+w78fjnDnNvvczM6+ZSdgnn898NpfP5/MBAACQoEZZDwAAAJAVQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABULR+9KMfxWmnnRZDhgyJnXbaKTp37hyLFy/OeiwAGhBBBEDRmjdvXjz11FNx9tlnx3vvvRc9e/aM22+/PeuxAGhABBEARWvevHkxatSo6NOnTzRq1Cj23HPPyOfzWY8FQAMiiAAoSuvXr48FCxbEscceW7M2f/782GeffTKcCoCGRhABUJQWL14c5eXl0a5du5q1uXPnRrdu3TKcCoCGRhABUJTmzZsXPXr0qPl69erV8fe//z26dOmS3VAANDiCCICiNG/evOjevXvN1/Pnz48999wzysrKMpwKgIYml/fpVAAAIFH2EAEAAMkSRAAAQLIEEQBF4dZbb41cLrdVl3fffTfr8QHYTgkiAIpCLpfLegQAEuSkCgAUhX/+859xxBFHxF//+teIiLjkkkti8ODBm3XbvffeO0pKSupxOgAaKkEEQNF466234tBDD43FixdHSUlJTJw4Mb7yla9kPRYADZggAqCovPrqq3HooYfGq6++GjvssEM88MAD0a9fv6zHAqCBEkQAFJ3FixfHoYceGm+99VaUlZXF5MmT4/DDD896LAAaIEEEQFGaP39+HH744fHPf/4zysvL49FHH40DDjgg67EAaGCcZQ6AotSlS5d4+OGHo0WLFrFy5cr44he/WHPCBQCoK4IIgKLVq1ev+P3vfx877rhjvPfee3H00UfH4sWLN/v2zz33XJxyyimx++67R1lZWbRu3TpOPPHEeOmll+pxagC2Jw6ZA6DoPfLII/GlL30pqqqqon379vH000/H5z73uU+93bhx4+Ldd9+NLl26xM477xyvvfZajBkzJho3bhxz5swpwOQAFDtBBMB24bTTTouJEydGRMSVV14Zo0aN2qLbV1dXR3V1dUyYMCHOOuusWLZsWey0004REVFVVRUdOnSIhQsXRkVFxSZv36FDh5g+fXq0adNmW54KAEVEEAFQ9G644Ya48MILIyJiwIABMXHixGjU6JOP+s7n8zFp0qS45ZZb4oUXXoi33norPvorr1GjRrF69eooLS2t99kBKG4+QwRAUfvFL34RI0eOjIiIo446Ku6+++5PjaGIiP/7v/+L0047LTp37hy33HJLPPXUUzF9+vTo3r177LXXXrVi6Cc/+UmcddZZn3h/48aNi9NPP33bngwARadx1gMAwKb84Q9/iMGDB0c+n48DDjgg7r///thhhx0+9XYLFy6Mn/70p3HttdfGxRdfXLP+7rvvxvz58+Pkk0+utf3cuXOjW7dun3if8+fPjy5dumzdEwGgaNlDBEBR+stf/hIDBgyIdevWRadOneIPf/hDNG/efLNuu2TJkoiI6Ny5c6314cOHx7p166J379611gURQLrsIQKg6MyfPz/69+8fq1evjt122y2mTJkSu+yyy2bfvnv37rHjjjvGd77zncjlcvGvf/0rbr/99ppTdn88iKqrq2PBggWbFURdu3bduicEQNGyhwiAorJkyZI45phjYtmyZdGyZct4+OGHo3379lt0H7vuumv86le/in/9619x0kknxXe/+9049thj48wzz4xGjRrF/vvvX7Pt4sWLo6KiIlq1arXJ+3vvvfdi+fLl0bFjx61+XgAUJ3uIACga77zzTvTt2zfeeOONaNasWfzhD3/Y4LC3zdW/f//o37//ButXXHFFra//+3C5wYMHR0TEz3/+85q1+fPnx7777rtZJ3MAYPviT3YAisLKlSvj2GOPjUWLFkWTJk1i0qRJceCBB9b7486bN69WEL3++utx8MEH19rG4XIADZffQwRAURg4cGD84he/2Krbjh8/vmbPzrZYt25ddOvWLebMmRNNmjSpWT/vvPNir732qjn9NwANhz1EABSF119/PesRonHjxrFgwYJaMfTBBx/E5MmT47DDDstwMgDqi88QAVAU7rzzzli9evVW3bZt27Z1PM2/Pfvss3HiiSfG0KFDNzhVNwANg0PmAACAZDlkDgAASJYgAiATVVVV0aZNm1i+fPlW38fYsWOjZ8+e0aRJkxg1alTdDQdAMnyGCIBMlJaWxltvvbVN99G2bdv43ve+F3feeWcdTQVAauwhAiATP/nJT+Kss87apvs44YQT4rjjjouKioo6mgqA1AgiADIxd+7c2G+//WqtfelLX4qddtppo5drrrkmo0kBaMgcMgdAJubOnRsDBw6stfbQQw9lNA0AqbKHCICCq66ujgULFkS3bt2yHgWAxAkiAApu8eLFUVFREa1ataq13q9fv2jevPlGL2PGjMloWgAaMofMAVBwc+fO3ejeocmTJ2/R/axbty7WrVsX69evj3Xr1sWaNWuiSZMmUVJSUlejAtDA2UMEQMHNmzevTg6XGz16dJSVlcXPf/7zuPrqq6OsrCzuuuuuOpgQgFTk8vl8PushAAAAsmAPEQAAkCxBBAAAJEsQAQAAyWpQZ5m7J9cp6xEy99V1N2c9Qqbyy5dmPULm1rTomvUImWq65JGsR8jcr9YO/PSNGrh3l/8r6xEyNfTR4VmPkLmDHjwm6xEyNXNKq0/fqKEr3yXrCbK3Nu0/C6PplzZrM3uIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWUUTRE8++WQcd9xx0a5du8jlcvHAAw9kPRIAANDAFU0QrVq1Krp37x4333xz1qMAAACJaJz1AB/p169f9OvXL+sxAACAhBTNHiIAAIBCK5o9RFuqqqoqqqqqaq19GNXRROMBAACbabuth8rKyqioqKh1eTDey3osAABgO7LdBtFll10Wy5cvr3X5crTMeiwAAGA7st0eMldaWhqlpaW11hwuBwAAbImiCaIPPvggFi9eXPP1K6+8ErNnz46WLVtG+/btM5wMAABoqIomiJ5//vk48sgja74eOXJkREQMGjQofv7zn2c0FQAA0JAVTRAdccQRkc/nsx4DAABIiA/dAAAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsnL5fD6f9RAAAABZsIcIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSVTRBVFlZGQcccECUl5dH69at44QTToiFCxdmPRYAANCAFU0QTZs2LYYNGxbPPPNMTJ06NdatWxd9+/aNVatWZT0aAADQQOXy+Xw+6yE25p133onWrVvHtGnT4rDDDst6HAAAoAEqmj1E/2358uUREdGyZcuMJwEAABqqotxDlM/n4/jjj49ly5bFU089lfU4AABAA9U46wE25vzzz4+5c+fG008/vcltqqqqoqqqqtZaaWlplJaW1vd4AABAA1F0h8xdcMEF8eCDD8bjjz8eu+222ya3q6ysjIqKilqXysrKAk4KAABs74rmkLl8Ph8XXHBB3H///fHEE0/E3nvv/Ynb20MEAABsq6IJovPOOy/uueee+O1vfxudOnWqWa+oqIiysrIMJwMAABqqogmiXC630fXx48fH4MGDCzsMAACQhKI5qUKRdBkAAJCQojupAgAAQKEIIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWUUTRGPHjo1u3bpFixYtokWLFtGnT5+YPHly1mMBAAANWC6fz+ezHiIi4ne/+12UlJTEXnvtFREREyZMiOuuuy5mzZoVXbp0yXg6AACgISqaINqYli1bxnXXXRdDhw7NehQAAKABapz1ABuzfv36+PWvfx2rVq2KPn36ZD0OAADQQBVVEM2bNy/69OkTa9asiebNm8f9998fnTt33ui2VVVVUVVVVWuttLQ0SktLCzEqAADQABTNSRUiIjp16hSzZ8+OZ555Jr7+9a/HoEGDYsGCBRvdtrKyMioqKmpdKisrCzwxAACwPSvqzxAdddRRseeee8Ztt922wffsIQIAALZVUR0y99/y+fwG0fMR8QMAAGyrogmiyy+/PPr16xef+9znYuXKlTFx4sR44okn4o9//GPWowEAAA1U0QTR22+/HV/72tfiH//4R1RUVES3bt3ij3/8Yxx99NFZjwYAADRQRf0ZIgAAgPpUVGeZAwAAKCRBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAydqiIBo4cGD861//ioiI1157rV4GAgAAKJTGW7Jx8+bNo6qqKsrKyqJDhw6x8847R/fu3aN79+7Ro0eP6N69e3Tp0iWaNGlSX/MCAADUmVw+n89vzQ2XLFkSs2fPjjlz5tT879///vdo3Lhx7LPPPjFnzpytHqqysjIuv/zyGD58eNxwww1bfT8AAACfZIv2EH1chw4dokOHDnH88cfXrK1cuTJmz54dc+fO3eqBpk+fHuPGjYtu3bpt9X0AAABsjjo9qUJ5eXkceuihMWzYsK26/QcffBCnn3563H777bHzzjvX5WgAAAAbKKqzzA0bNiz69+8fRx11VNajAAAACdjqQ+bq2sSJE2PmzJkxffr0rEcBAAASURRB9Nprr8Xw4cNjypQp0bRp0826TVVVVVRVVdVaKy0tjdLS0voYEQAAaICK4pC5GTNmxNKlS6NXr17RuHHjaNy4cUybNi1uvPHGaNy4caxfv36D21RWVkZFRUWtS2VlZQbTAwAA26utPu12XVq5cmUsWbKk1tqZZ54Z++yzT1xyySXRtWvXDW5jDxEAALCt6uWQuUaNGsURRxwR1113XfTq1etTty8vL98gepo1axatWrXaaAxFiB8AAGDb1cshc3fccUccfvjh8Y1vfKM+7h4AAKBOFMUhcwAAAFnY6j1EjzzyyCa/d9ttt23t3QIAABTMVgdR//7945vf/GasXbu2Zu2dd96J4447Li677LI6GQ4AAKA+bXUQPfnkk/G73/0uDjjggJg/f378/ve/j65du8YHH3wQc+bMqcsZAQAA6sU2fYZo1apVce6558avf/3rqK6ujtGjR8fFF18cuVyuLmcEAACoF9t0lrmFCxfG9OnTY7fddovGjRvHCy+8EKtXr66r2QAAAOrVVgfRNddcE3369Imjjz46/vrXv8b06dNj1qxZ0a1bt/jLX/5SlzMCAADUi60+ZK5t27Zxxx13RL9+/WrWPvzww7j88svjxhtvjKqqqjobEgAAoD5sdRC9++67scsuu2z0e9OmTYvDDz98mwYDAACob34xKwAAkKxtOqnCU089FQMHDow+ffrEG2+8ERERd911Vzz99NN1MhwAAEB92uogmjRpUhxzzDFRVlYWs2bNqvnM0MqVK2PMmDF1NiAAAEB92eogGj16dNx6661x++23R5MmTWrWDzrooJg5c2adDAcAAFCftjqIFi5cGIcddtgG6y1atIj3339/W2YCAAAoiK0OorZt28bixYs3WH/66adjjz322KahAAAACmGrg+icc86J4cOHx7PPPhu5XC7efPPN+MUvfhEXXXRRnHfeeXU5IwAAQL3YptNuX3HFFfHjH/841qxZExERpaWlcdFFF8X3v//9OhsQAACgvmzz7yFavXp1LFiwIKqrq6Nz587RvHnzupoNAACgXvnFrAAAQLIab8nGI0eO3Oxtr7/++i0eBgAAoJC2KIhmzZpV6+sZM2bE+vXro1OnThERsWjRoigpKYlevXrV3YQAAAD1ZIuC6PHHH6+5fv3110d5eXlMmDAhdt5554iIWLZsWZx55plx6KGH1u2UAAAA9WCrP0P02c9+NqZMmRJdunSptf7Xv/41+vbtG2+++WadDAgAAFBftvr3EK1YsSLefvvtDdaXLl0aK1eu3KahAAAACmGrg+jEE0+MM888M37zm9/E66+/Hq+//nr85je/iaFDh8ZJJ51UlzMCAADUi60+ZG716tVx0UUXxR133BEffvhh5PP5aNKkSQwdOjSuu+66aNasWV3PCgAAUKe2+fcQrVq1Kl566aXI5/Ox1157CSEAAGC7sUVnmftvjz76aDz66KOxdOnSqK6urvW9O+64Y5sGAwAAqG9bHUTf+9734qqrrorevXtH27ZtI5fL1eVcAAAA9W6rD5lr27ZtXHvttfG1r32trmcCAAAoiK0+y9zatWvjoIMOqstZAAAACmqrg+iss86Ke+65py5nAQAAKKit/gzRmjVrYty4cfHII49Et27dokmTJrW+f/3112/zcAAAAPVpqz9DdOSRR276TnO5eOyxx7Z6KAAAgELY5t9DBAAAsL3a6s8QAQAAbO+2+DNEJ5100mZtd999923xMAAAAIW0xUFUUVFRH3MAAAAUnM8QAQAAyfIZIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZBVNEI0aNSpyuVytS5s2bbIeCwAAaMAaZz3Ax3Xp0iUeeeSRmq9LSkoynAYAAGjoiiqIGjdubK8QAABQMEVzyFxExIsvvhjt2rWLjh07xqmnnhovv/xy1iMBAAANWC6fz+ezHiIiYvLkybF69er4/Oc/H2+//XaMHj06XnjhhZg/f360atVqg+2rqqqiqqqq1lppaWmUlpYWamQAAGA7VzR7iPr16xf/+7//G/vtt18cddRR8fvf/z4iIiZMmLDR7SsrK6OioqLWpbKyspAjAwAA27mi2UO0MUcffXTstddeMXbs2A2+Zw8RAACwrYrqpAofV1VVFX/729/i0EMP3ej3xQ8AALCtiuaQuYsuuiimTZsWr7zySjz77LPxla98JVasWBGDBg3KejQAAKCBKpo9RK+//nqcdtpp8e6778ZnPvOZ+H//7//FM888Ex06dMh6NAAAoIEq6s8QAQAA1Kei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vvnm+Nvf/hbXXnttXHfddXHTTTdlPVpBnXXWWTF16tS46667Yt68edG3b9846qij4o033sh6tDr3aT//XHvttXH99dfHzTffHNOnT482bdrE0UcfHStXrizwpPXn016DVatWxcEHHxzXXHNNgScrnE96DVavXh0zZ86M73znOzFz5sy47777YtGiRfHlL385g0k/QZ46FRH5+++/P+sxMrV06dJ8ROSnTZuW9SiZ2XnnnfM//elPsx6joFauXJnfe++981OnTs0ffvjh+eHDh2c9UsFceeWV+e7du2c9RqYuueSS/CGHHJL1GEVl+PDh+T333DNfXV2d9SgF0b9///yQIUNqrZ100kn5gQMHZjRR4a1evTpfUlKSf+ihh2qtd+/ePX/FFVdkNFVh/PfPP9XV1fk2bdrkr7nmmpq1NWvW5CsqKvK33nprBhPWv0/6GfCVV17JR0R+1qxZBZ2p0Dbn5+DnnnsuHxH5JUuWFGaozWAPEXVu+fLlERHRsmXLjCcpvPXr18fEiRNj1apV0adPn6zHKahhw4ZF//7946ijjsp6lEy8+OKL0a5du+jYsWOceuqp8fLLL2c9UkE9+OCD0bt37xgwYEC0bt069t9//7j99tuzHisza9eujbvvvjuGDBkSuVwu63EK4pBDDolHH300Fi1aFBERc+bMiaeffjqOPfbYjCcrnHXr1sX69eujadOmtdbLysri6aefzmiqbLzyyivx1ltvRd++fWvWSktL4/DDD48///nPGU5G1pYvXx65XK6ojiBonPUANCz5fD5GjhwZhxxySHTt2jXrcQpm3rx50adPn1izZk00b9487r///ujcuXPWYxXMxIkTY+bMmQ32OPlPc+CBB8add94Zn//85+Ptt9+O0aNHx0EHHRTz58+PVq1aZT1eQbz88ssxduzYGDlyZFx++eXx3HPPxTe+8Y0oLS2NM844I+vxCu6BBx6I999/PwYPHpz1KAVzySWXxPLly2OfffaJkpKSWL9+fVx99dVx2mmnZT1awZSXl0efPn3i+9//fuy7776x6667xi9/+ct49tlnY++99856vIJ66623IiJi1113rbW+6667xpIlS7IYiSKwZs2auPTSS+OrX/1qtGjRIutxaggi6tT5558fc+fOTe5fwjp16hSzZ8+O999/PyZNmhSDBg2KadOmJRFFr732Wgwf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dGm89NJLsXbt2prQiYho2bJlrT00CxYsiDVr1tQE00fWrl0b+++/f621H/7wh9G1a9f41a9+Fc8//3w0bdp0i+acPXt29OjRY4tuA0BxE0QAZK5Jkya1vs7lclFdXR35fP5Tb1tdXR0REb///e/js5/9bK3vlZaW1vr65ZdfjjfffDOqq6tjyZIlG4TYp5kzZ04MHTp0i24DQHETRAAUrb322iuaNGkSzzzzTLRv3z4iIpYtWxaLFi2qORSuc+fOUVpaGq+++mrN2sasXbs2Tj/99DjllFNin332iaFDh8a8efNi11133axZPvzww/jb3/4W3bt33/YnBkDREEQAFK3mzZvH0KFD4+KLL45WrVrFrrvuGldccUU0avSfcwKVl5fHRRddFBdeeGFUV1fHIYccEitWrIg///nP0bx58xg0aFBE/Pv3By1fvjxuvPHGaN68eUyePDmGDh0aDz300GbNsmDBgvjwww8FEUADI4gAKGrXXXddfPDBB/HlL385ysvL45vf/GYsX7681jbf//73o3Xr1lFZWRkvv/xy7LTTTtGzZ8+4/PLLIyLiiSeeiBtuuCEef/zxaNGiRURE3HXXXdGtW7cYO3ZsfP3rX4+f//znceaZZ27yML3Zs2dHhw4d/B4igAYml9+cA7QBoIEbNWpUPPHEE/HEE09s9Pvnn39+LF26NH71q18VdjAA6pXfQwQAEfHwww/Htddeu8H6mjVrYubMmTFp0qQ45phjMpgMgPpkDxEAfIJrrrkmbrrppvjyl78cN9544wZnxANg+yaIAACAZDlkDgAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEiWIAIAAJIliAAAgGQJIgAAIFmCCAAASJYgAgAAkiWIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSIAACBZgggAAEhW46wHqEs9D7yl5nquUe4/10v+cz0aNdroel1t//H1KKndm5tzm00+9hY+3pY+Vu5jj9XoY9s02sT2m9qm9vWP3ecmbpvbnPvZ5ONu/Plu3m03Nc/GZ97c2zfKbXy9ZAu3r339PzOUbM72m7FNyRbPsIXPcZP3GRvfJrep9Y1vU7IZt938x9iyx96c9ZJ6uM9cVP/neu4/1xvF+o2u19X2uY9t32gLt6/9uFt22219vFz+P9djk9fzG1+v3pzbbmr7Tdznx67nN+uxPv1+Nm/O/JZtX7051zdxn5t9+824r+rNeL228H7qY7Zac67/+PYfu/6x9fwm1mN99adv87H12o9VvdHtN/1Ym9hmm+fYsueT38T9fHy9elPbb+J136z73IxtNn0/n/64m3X/W/i41bXuPzZ6fYPv1cd/Epv8Y+/T5yvgf4q1rn81vzA2hz1EAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAkSxABAADJEkQAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsnL5fD6f9RCwKVVVVVFZWRmXXXZZlJaWZj0OBeJ9T5f3Pl3e+3R579NVLO+9IKKorVixIioqKmL58uXRokWLrMehQLzv6fLep8t7ny7vfbqK5b13yBwAAJAsQQQAACRLEAEAAMkSRBS10tLSuPLKK33IMjHe93R579PlvU+X9z5dxfLeO6kCAACQLHuIAACAZAkiAAAgWYIIAABIliACAACSJYgAAIBkCSK2O1VVVdGjR4/I5XIxe/bsrMehnv3973+PoUOHRseOHaOsrCz23HPPuPLKK2Pt2rVZj0Y9uOWWW6Jjx47RtGnT6NWrVzz11FNZj0Q9q6ysjAMOOCDKy8ujdevWccIJJ8TChQuzHosCq6ysjFwuFyNGjMh6FArgjTfeiIEDB0arVq1ixx13jB49esSMGTMym0cQsd351re+Fe3atct6DArkhRdeiOrq6rjtttti/vz58eMf/zhuvfXWuPzyy7MejTp27733xogRI+KKK66IWbNmxaGHHhr9+vWLV199NevRqEfTpk2LYcOGxTPPPBNTp06NdevWRd++fWPVqlVZj0aBTJ8+PcaNGxfdunXLehQKYNmyZXHwwQdHkyZNYvLkybFgwYL40Y9+FDvttFNmM/k9RGxXJk+eHCNHjoxJkyZFly5dYtasWdGjR4+sx6LArrvuuhg7dmy8/PLLWY9CHTrwwAOjZ8+eMXbs2Jq1fffdN0444YSorKzMcDIK6Z133onWrVvHtGnT4rDDDst6HOrZBx98ED179oxbbrklRo8eHT169Igbbrgh67GoR5deemn86U9/KqojAOwhYrvx9ttvx9lnnx133XVX7LjjjlmPQ4aWL18eLVu2zHoM6tDatWtjxowZ0bdv31rrffv2jT//+c8ZTUUWli9fHhHhv/FEDBs2LPr37x9HHXVU1qNQIA8++GD07t07BgwYEK1bt479998/br/99kxnEkRsF/L5fAwePDjOPffc6N27d9bjkKGXXnopbrrppjj33HOzHoU69O6778b69etj1113rbW+6667xltvvZXRVBRaPp+PkSNHxiGHHBJdu3bNehzq2cSJE2PmzJn2ACfm5ZdfjrFjx8bee+8dDz/8cJx77rnxjW98I+68887MZhJEZGrUqFGRy+U+8fL888/HTTfdFCtWrIjLLrss65GpI5v73n/cm2++GV/84hdjwIABcdZZZ2U0OfUpl8vV+jqfz2+wRsN1/vnnx9y5c+OXv/xl1qNQz1577bUYPnx43H333dG0adOsx6GAqquro2fPnjFmzJjYf//945xzzomzzz671uHShdY4s0eG+PdffqeeeuonbrP77rvH6NGj45lnnonS0tJa3+vdu3ecfvrpMWHChPock3qwue/9R95888048sgjo0+fPjFu3Lh6no5C22WXXaKkpGSDvUFLly7dYK8RDdMFF1wQDz74YDz55JOx2267ZT0O9WzGjBmxdOnS6NWrV83a+vXr48knn4ybb745qqqqoqSkJMMJqS9t27aNzp0711rbd999Y9KkSRlNJIjI2C677BK77LLLp2534403xujRo2u+fvPNN+OYY46Je++9Nw488MD6HJF6srnvfcS/T8955JFHRq9evWL8+PHRqJGd2w3NDjvsEL169YqpU6fGiSeeWLM+derUOP744zOcjPqWz+fjggsuiPvvvz+eeOKJ6NixY9YjUQBf+MIXYt68ebXWzjzzzNhnn33ikksuEUMN2MEHH7zBqfUXLVoUHTp0yGgiQcR2on379rW+bt68eURE7Lnnnv4lsYF7880344gjjoj27dvHD3/4w3jnnXdqvtemTZsMJ6OujRw5Mr72ta9F7969a/YEvvrqqz4v1sANGzYs7rnnnvjtb38b5eXlNXsJKyoqoqysLOPpqC/l5eUbfE6sWbNm0apVK58fa+AuvPDCOOigg2LMmDFx8sknx3PPPRfjxo3L9OgPQQQUtSlTpsTixYtj8eLFG8Sv3xrQsJxyyinxz3/+M6666qr4xz/+EV27do0//OEPmf6rIfXvo88NHHHEEbXWx48fH4MHDy78QEC9OuCAA+L++++Pyy67LK666qro2LFj3HDDDXH66adnNpPfQwQAACTLgfgAAECyBBEAAJAsQQQAACRLEAEAAMkSRAAAQLIEEQAAkCxBBAAAJEsQAQAAyRJEAABAsgQRAACQLEEEAAAk6/8Dmavnl10EZQEAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x1000 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "all_1 = np.ones((8, 1))  # 创建一个全1列向量，大小为8行1列\n",
    "sum_over_i = all_1.T @ a_ij  # 对行方向求和，结果为一行\n",
    "\n",
    "title = r'$\\sum_{i=1}^{n} a_{i,j}$'  # 设置图表标题，表示对i求和\n",
    "heatmap_sum(sum_over_i, i_array, j_array, title)  # 绘制部分求和结果的热力图"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4dd099cf-6fa3-4739-82ca-eadd6bce5777",
   "metadata": {},
   "source": [
    "## 对矩阵 $a_{i,j}$ 按列进行部分求和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fb421b5a-56c6-49f3-8255-91d43e73fe72",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0wAAAMVCAYAAABEHHSIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+LElEQVR4nO3deZzVdd3//9cwwMg6CsaWgoheoiCgwI0L3EsxRNy+F26QINhVl6goaW6VZAim5dfSnyBWiJJhpZAtpGiCcZWyyeKgIGq4RWjhyBKDMOf3R19HR3jLAAOfM879frvN7TbzmTNnnpxx4cHncw4FuVwuFwAAAGyjTtYDAAAA8pVgAgAASBBMAAAACYIJAAAgQTABAAAkCCYAAIAEwQQAAJAgmAAAABIEEwAAQIJgAgAASBBMAOSdH/7whzFw4MC48MILo2nTptGrV69YvXp1XHHFFdGsWbPo3LlzrFq1KuuZANQCggmAvLNkyZKYO3dufP3rX481a9bEBx98EF/84hfjjDPOiDVr1kT79u3j/vvvz3omALVA3awHAMAnLVmyJL7zne9E9+7dIyKiQ4cO0alTpzj55JMjIqJjx46xdevWLCcCUEs4wwRAXikvL49ly5bFl770pYpjn/z4xRdfjI4dO2YxD4BaRjABkFdWrlwZjRs3jlatWkVERFlZWaxcuTKOPPLIitssWbIkunTpktVEAGoRwQRAXlmyZEl07dq14uOSkpJo165dNGrUKCIi3nvvvVizZo0zTADsFYIJgLyydOnSSsG0ePHiSh8vXbo0Dj/88Khb19NwAdjzCnK5XC7rEQAAAPnIGSYAAIAEwQQAAJAgmADICxMmTIiCgoJdenv33Xezng/AZ5RgAiAvFBQUZD0BALbhRR8AyAv/+Mc/4sQTT4wXXnghIiKuvfbaGDp0aJW+9tBDD43CwsI9uA6A2kowAZA3Vq9eHccdd1ysXLkyCgsLY+rUqfFf//VfWc8CoBYTTADklddffz2OO+64eP3116N+/foxffr06NevX9azAKilBBMAeWflypVx3HHHxerVq6NBgwYxY8aMOOGEE7KeBUAtJJgAyEslJSVxwgknxD/+8Y9o0qRJPPXUU9GzZ8+sZwFQy3iVPADyUqdOneLxxx+Ppk2bxrp16+JLX/pSxQtCAMDeIpgAyFvdu3eP3/3ud9GwYcP45z//GaecckqsXLlyp+5j7ty5cd5558VBBx0UDRo0iBYtWsTZZ58dr7zyyh5aDcBniUvyAMh7Tz75ZJx++ulRVlYWbdu2jTlz5sSBBx5Ypa+dOHFivPvuu9GpU6fYb7/94o033oixY8dG3bp1Y/HixXt4OQA1nWACoEa44IILYurUqRERcdNNN8Xo0aN3+j7Ky8ujvLw8Jk+eHJdcckmsXbs29t133ygrK4t27drF8uXLo7i4OPm17dq1i3nz5kWrVq1255cCQA0imADIe3feeWdcddVVERExcODAmDp1atSps+OrynO5XDzyyCNxzz33xEsvvRSrV6+OD/+3V6dOndi4cWMUFRXt0e0A1GyewwRAXvvZz34Wo0aNioiIk08+OaZMmVKlWIqI+O///u+44IIL4ogjjoh77rkn/vSnP8W8efOia9euccghh1TE0g9/+MO45JJLPvW+Jk6cGIMGDdq9XwwANU7drAcAQMrvf//7GDp0aORyuejZs2dMmzYt6tevX6WvXb58efz4xz+O2267La655pqK4++++26UlJTEueeeW3FsyZIl0aVLl0+9v5KSkujUqdOu/UIAqLGcYQIgL/3lL3+JgQMHxpYtW+Kwww6L3//+99G4ceMqf/2qVasiIuKII46odHzkyJGxZcuW6NGjR8UxwQRAijNMAOSdkpKS6N+/f2zcuDEOOOCAeOKJJ2L//fffqfvo2rVrNGzYML71rW9FQUFB/Otf/4r77ruv4mXJPwym8vLyWLZsWZWCqXPnzrv2CwKgxnKGCYC8smrVqjj11FNj7dq10axZs3j88cejbdu2O30/LVu2jF/84hfxr3/9K84555z49re/HaeddlpcfPHFUadOnTjqqKMiImLlypVRXFwczZs3T97XP//5zygtLY327dvv8q8LgJrJGSYA8sY777wTffv2jbfeeisaNWoUv//977e5pG5n9O/fP/r377/N8RtvvLHi/U9ejjd06NCIiLj//vsrjpWUlMThhx9e5RebAOCzw3/5AcgL69ati9NOOy1WrFgR9erVi0ceeSR69eq1x7/v0qVLKwXTm2++Gcccc0yl27gcD6D28vcwAZAXBg8eHD/72c926WsnTZpUcWZod2zZsiW6dOkSixcvjnr16lUcv/TSS+OQQw6peHlzAGoPZ5gAyAtvvvlm1hOibt26sWzZskqxtH79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IEEwAQAAJAgmAACAhLwMpnHjxkVBQUFceeWVWU8BAABqsbwLpnnz5sXEiROjS5cuWU8BAABqubwKpvXr18egQYPivvvui/322y/rOQAAQC2XV8E0YsSI6N+/f5x88slZTwEAAIi6WQ/40NSpU2PhwoUxb968rKcAAABERJ4E0xtvvBEjR46MJ554IvbZZ58qfU1ZWVmUlZVVOrblg81Rt179PTERAACohfLikrwFCxbEmjVronv37lG3bt2oW7duzJ49O370ox9F3bp1Y+vWrdt8zbhx46K4uLjS25yHJ2awHgAA+KwqyOVyuaxHrFu3LlatWlXp2MUXXxwdO3aMa6+9Njp37rzN12zvDNNts15zhuljRvc7POsJAABQo+XFJXlNmjTZJooaNWoUzZs3324sRUQUFRVFUVFRpWNiCQAAqE55cUkeAABAPsqLM0zbM2vWrKwnAAAAtZwzTAAAAAmCCQAAIEEwAQAAJAgmAACAhJ0KpsGDB8e//vWviIh444039sggAACAfLFTr5LXuHHjKCsriwYNGkS7du1iv/32i65du0bXrl2jW7du0bVr1+jUqVPUq1dvT+0FAADYa3YqmCZMmFDx/muvvRaLFi2KxYsXx6JFi+Kxxx6Lv/71r1G3bt3o2LFjLF68uNrHAgAA7E27/PcwtWvXLtq1axdnnnlmxbF169bFokWLYsmSJdUyDgAAIEvV+hfXNmnSJI477rg47rjjqvNuAQAAMuFV8gAAABIEEwAAQIJgAgAASBBMAAAACYIJAAAgYY8EU506deILX/hCLFiwYE/cPQAAwF6xR4Lppz/9aZxwwglxxRVX7Im7BwAA2CsKcrlcLusR1WX0jBeznpBXRvc7POsJAABQo+3yGaYnn3wy+bl77713V+8WAAAgb+xyMPXv3z++/vWvx+bNmyuOvfPOOzFgwIC4/vrrq2UcAABAlnY5mJ555pn4zW9+Ez179oySkpL43e9+F507d47169fH4sWLq3MjAABAJnY5mHr16hXPP/98dOnSJbp37x5nn312fP3rX48//vGPceCBB1bnRgAAgEzs1qvkLV++PObNmxcHHHBA1K1bN1566aXYuHFjdW0DAADI1C4H06233hq9e/eOU045JV544YWYN29exRmnv/zlL9W5EQAAIBO7HEw//OEPY/r06XHXXXfFPvvsE506dYq5c+fGOeecEyeeeGI1TgQAAMhG3V39wqVLl8b+++9f6Vi9evXi9ttvj9NPP323hwEAAGRtl88wfTKWPu6EE07Y1bsFAADIG7v1og9/+tOfYvDgwdG7d+946623IiLiwQcfjDlz5lTLOAAAgCztcjA98sgjceqpp0aDBg3i+eefj7KysoiIWLduXYwdO7baBgIAAGRll4NpzJgxMWHChLjvvvuiXr16Fcf79OkTCxcurJZxAAAAWdrlF31Yvnx5HH/88dscb9q0abz33nu7s2mXzfypUPu40f0Oz3oCAADUaLt8hql169axcuXKbY7PmTMnDj744N0aBQAAkA92OZi++tWvxsiRI+O5556LgoKCePvtt+NnP/tZXH311XHppZdW50YAAIBM7PIled/4xjeitLQ0TjrppNi0aVMcf/zxUVRUFFdffXVcdtll1bkRAAAgEwW5XC63O3ewcePGWLZsWZSXl8cRRxwRjRs3rq5tO+2YgT/L7Hvno//95aCsJwAAQI22y2eYPtSwYcPo0aNHdWwBAADIKzsVTKNGjarybe+4446dHgMAAJBPdiqYnn/++UofL1iwILZu3RqHHXZYRESsWLEiCgsLo3v37tW3EAAAICM7FUxPP/10xft33HFHNGnSJCZPnhz77bdfRESsXbs2Lr744jjuuOOqdyUAAEAGdvlFHz7/+c/HE088EZ06dap0/IUXXoi+ffvG22+/XS0Dd4YXfajMiz4AAMDu2eW/h+n999+Pv//979scX7NmTaxbt263RgEAAOSDXQ6ms88+Oy6++OL41a9+FW+++Wa8+eab8atf/SqGDx8e55xzTnVuBAAAyMQuv6z4hAkT4uqrr47BgwfHBx98ELlcLurVqxfDhw+P22+/vTo3AgAAZGK3/+LaDRs2xCuvvBK5XC4OOeSQaNSoUXVt22mew1SZ5zABAMDu2a2/uPapp56Kp556KtasWRPl5eWVPvfTn/50t4YBAABkbZeD6Tvf+U7cfPPN0aNHj2jdunUUFBRU5y4AAIDM7dZzmO6///748pe/XJ17AAAA8sYuv0re5s2bo0+fPtW5BQAAIK/scjBdcskl8dBDD1XnFgAAgLyyy5fkbdq0KSZOnBhPPvlkdOnSJerVq1fp83fcccdujwMAAMjSLgfTkiVLolu3bhER8cILL1T6nBeAAAAAPgt2OZiefvrp6twBAACQd3b5OUwAAACfdTt9humcc86p0u0effTRnR4DAACQT3Y6mIqLi/fEDgAAgLyz08E0adKkPbEDAAAg73gOEwAAQELeBNPo0aOjoKCg0lurVq2yngUAANRiu/yy4ntCp06d4sknn6z4uLCwMMM1AABAbZdXwVS3bl1nlQAAgLyRN5fkRUS8/PLL0aZNm2jfvn2cf/758eqrr2Y9CQAAqMXyJph69eoVDzzwQDz++ONx3333xerVq6NPnz7xj3/8I+tpAABALZU3l+T169ev4v0jjzwyevfuHR06dIjJkyfHqFGjtrl9WVlZlJWVVTpWvvWDqFNYb49vBQAAaoe8OcP0SY0aNYojjzwyXn755e1+fty4cVFcXFzp7c2XHtvLKwEAgM+yvA2msrKyePHFF6N169bb/fz1118fpaWlld4O6HjGXl4JAAB8luXNJXlXX311DBgwINq2bRtr1qyJMWPGxPvvvx9DhgzZ7u2LioqiqKio0jGX4wEAANUpb4LpzTffjAsuuCDefffd+NznPhf/+Z//Gc8++2y0a9cu62kAAEAtlTfBNHXq1KwnAAAAVJK3z2ECAADImmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACTUzXpAdfrX66VZTwAAAD5DnGECAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACAhr4LprbfeisGDB0fz5s2jYcOG0a1bt1iwYEHWswAAgFqqbtYDPrR27do45phj4qSTTooZM2ZEixYt4pVXXol9990362kAAEAtlTfB9L3vfS8OPPDAmDRpUsWxgw46KLtBAABArZc3l+Q99thj0aNHjxg4cGC0aNEijjrqqLjvvvuyngUAANRieRNMr776aowfPz4OPfTQePzxx+NrX/taXHHFFfHAAw9kPQ0AAKil8uaSvPLy8ujRo0eMHTs2IiKOOuqoKCkpifHjx8dFF120ze3LysqirKzsE/fxQdSpU2+v7AUAAD778uYMU+vWreOII46odOzwww+P119/fbu3HzduXBQXF1d6+/vbT+yNqQAAQC2RN8F0zDHHxPLlyysdW7FiRbRr1267t7/++uujtLS00lvLNn33xlQAAKCWyJtL8q666qro06dPjB07Ns4999yYO3duTJw4MSZOnLjd2xcVFUVRUVGlYy7HAwAAqlPenGHq2bNnTJs2LX7+859H586d47vf/W7ceeedMWjQoKynAQAAtVRBLpfLZT2iuhzd656sJ+SVhc9dmvUEAACo0fLmDBMAAEC+EUwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACTUzXpAdWp98sFZTwAAAD5DnGECAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACBBMAEAACQIJgAAgATBBAAAkCCYAAAAEgQTAABAgmACAABIEEwAAAAJggkAACAhb4LpoIMOioKCgm3eRowYkfU0AACglqqb9YAPzZs3L7Zu3Vrx8QsvvBCnnHJKDBw4MMNVAABAbZY3wfS5z32u0se33nprdOjQIU444YSMFgEAALVd3lyS93GbN2+OKVOmxLBhw6KgoCDrOQAAQC2Vl8E0ffr0eO+992Lo0KFZTwEAAGqxvLkk7+N+8pOfRL9+/aJNmzbJ25SVlUVZWVmlY1u3bI7CuvX39DwAAKCWyLszTKtWrYonn3wyLrnkkk+93bhx46K4uLjS2yt//sVeWgkAANQGeRdMkyZNihYtWkT//v0/9XbXX399lJaWVnrr0OfcvbQSAACoDfLqkrzy8vKYNGlSDBkyJOrW/fRpRUVFUVRUVOmYy/EAAIDqlFdnmJ588sl4/fXXY9iwYVlPAQAAyK8zTH379o1cLpf1DAAAgIjIszNMAAAA+UQwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASCnK5XC7rEdXl5V6dsp6QVw59riTrCQAAUKM5wwQAAJAgmAAAABIEEwAAQIJgAgAASBBMAAAACYIJAAAgQTABAAAkCCYAAIAEwQQAAJAgmAAAABIEEwAAQIJgAgAASBBMAAAACYIJAAAgQTABAAAkCCYAAIAEwQQAAJAgmAAAABIEEwAAQIJgAgAASBBMAAAACYIJAAAgQTABAAAkCCYAAIAEwQQAAJAgmAAAABIEEwAAQELeBNOWLVvim9/8ZrRv3z4aNGgQBx98cNx8881RXl6e9TQAAKCWqpv1gA9973vfiwkTJsTkyZOjU6dOMX/+/Lj44oujuLg4Ro4cmfU8AACgFsqbYPrLX/4SZ555ZvTv3z8iIg466KD4+c9/HvPnz894GQAAUFvlzSV5xx57bDz11FOxYsWKiIhYvHhxzJkzJ0477bSMlwEAALVV3pxhuvbaa6O0tDQ6duwYhYWFsXXr1rjlllviggsu2O7ty8rKoqysrNKxzeXlUb9O3jQgAABQw+VNXTz88MMxZcqUeOihh2LhwoUxefLk+P73vx+TJ0/e7u3HjRsXxcXFld4mvP3uXl4NAAB8lhXkcrlc1iMiIg488MC47rrrYsSIERXHxowZE1OmTImXXnppm9tv7wzTG1/s5QzTxxz6XEnWEwAAoEbLm0vyNm7cGHU+ETuFhYXJlxUvKiqKoqKiSsfEEgAAUJ3yJpgGDBgQt9xyS7Rt2zY6deoUzz//fNxxxx0xbNiwrKcBAAC1VN5ckrdu3br41re+FdOmTYs1a9ZEmzZt4oILLohvf/vbUb9+/Srdx8u9Ou3hlTWLS/IAAGD35E0wVQfBVJlgAgCA3eNJPwAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACAlBzVatOmTbmbbropt2nTpqynZM5jUZnH4yMei494LCrzeHzEY/ERj0VlHo+PeCwq83h8pDofi4JcLpfLOto+S95///0oLi6O0tLSaNq0adZzMuWxqMzj8RGPxUc8FpV5PD7isfiIx6Iyj8dHPBaVeTw+Up2PhUvyAAAAEgQTAABAgmACAABIEEzVrKioKG666aYoKirKekrmPBaVeTw+4rH4iMeiMo/HRzwWH/FYVObx+IjHojKPx0eq87Hwog8AAAAJzjABAAAkCCYAAIAEwQQAAJAgmAAAABIEUzV55plnYsCAAdGmTZsoKCiI6dOnZz0pM+PGjYuePXtGkyZNokWLFnHWWWfF8uXLs56VifHjx0eXLl2iadOm0bRp0+jdu3fMmDEj61l5Ydy4cVFQUBBXXnll1lMyMXr06CgoKKj01qpVq6xnZeatt96KwYMHR/PmzaNhw4bRrVu3WLBgQdazMnHQQQdt889GQUFBjBgxIutpe92WLVvim9/8ZrRv3z4aNGgQBx98cNx8881RXl6e9bRMrFu3Lq688spo165dNGjQIPr06RPz5s3LetZesaPfZ+VyuRg9enS0adMmGjRoECeeeGKUlJRkM3YP29Fj8eijj8app54a+++/fxQUFMSiRYsy2bm3fNrj8cEHH8S1114bRx55ZDRq1CjatGkTF110Ubz99ts79T0EUzXZsGFDdO3aNe6+++6sp2Ru9uzZMWLEiHj22Wdj5syZsWXLlujbt29s2LAh62l73QEHHBC33nprzJ8/P+bPnx9f+MIX4swzz/zM/ke8qubNmxcTJ06MLl26ZD0lU506dYq//e1vFW9Lly7NelIm1q5dG8ccc0zUq1cvZsyYEcuWLYsf/OAHse+++2Y9LRPz5s2r9M/FzJkzIyJi4MCBGS/b+773ve/FhAkT4u67744XX3wxbrvttrj99tvjrrvuynpaJi655JKYOXNmPPjgg7F06dLo27dvnHzyyfHWW29lPW2P29Hvs2677ba444474u6774558+ZFq1at4pRTTol169bt5aV73o4eiw0bNsQxxxwTt956615elo1Pezw2btwYCxcujG9961uxcOHCePTRR2PFihVxxhln7Nw3yVHtIiI3bdq0rGfkjTVr1uQiIjd79uysp+SF/fbbL/fjH/846xmZWbduXe7QQw/NzZw5M3fCCSfkRo4cmfWkTNx00025rl27Zj0jL1x77bW5Y489NusZeWvkyJG5Dh065MrLy7Oestf1798/N2zYsErHzjnnnNzgwYMzWpSdjRs35goLC3O//e1vKx3v2rVr7sYbb8xoVTY++fus8vLyXKtWrXK33nprxbFNmzbliouLcxMmTMhg4d7zab/nfO2113IRkXv++ef36qYsVeX34HPnzs1FRG7VqlVVvl9nmNjjSktLIyKiWbNmGS/J1tatW2Pq1KmxYcOG6N27d9ZzMjNixIjo379/nHzyyVlPydzLL78cbdq0ifbt28f5558fr776ataTMvHYY49Fjx49YuDAgdGiRYs46qij4r777st6Vl7YvHlzTJkyJYYNGxYFBQVZz9nrjj322HjqqadixYoVERGxePHimDNnTpx22mkZL9v7tmzZElu3bo199tmn0vEGDRrEnDlzMlqVH1577bVYvXp19O3bt+JYUVFRnHDCCfHnP/85w2Xko9LS0igoKNipqxjq7rk58O9rikeNGhXHHntsdO7cOes5mVi6dGn07t07Nm3aFI0bN45p06bFEUcckfWsTEydOjUWLlxYa665/zS9evWKBx54IP7jP/4j/v73v8eYMWOiT58+UVJSEs2bN8963l716quvxvjx42PUqFFxww03xNy5c+OKK66IoqKiuOiii7Kel6np06fHe++9F0OHDs16SiauvfbaKC0tjY4dO0ZhYWFs3bo1brnllrjggguynrbXNWnSJHr37h3f/e534/DDD4+WLVvGz3/+83juuefi0EMPzXpeplavXh0RES1btqx0vGXLlrFq1aosJpGnNm3aFNddd11ceOGF0bRp0yp/nWBij7rssstiyZIltfpPvw477LBYtGhRvPfee/HII4/EkCFDYvbs2bUumt54440YOXJkPPHEE9v8CWlt1K9fv4r3jzzyyOjdu3d06NAhJk+eHKNGjcpw2d5XXl4ePXr0iLFjx0ZExFFHHRUlJSUxfvz4Wh9MP/nJT6Jfv37Rpk2brKdk4uGHH44pU6bEQw89FJ06dYpFixbFlVdeGW3atIkhQ4ZkPW+ve/DBB2PYsGHx+c9/PgoLC+Poo4+OCy+8MBYuXJj1tLzwybOwuVyuVp6ZZfs++OCDOP/886O8vDzuueeenfpawcQec/nll8djjz0WzzzzTBxwwAFZz8lM/fr145BDDomIiB49esS8efPihz/8Ydx7770ZL9u7FixYEGvWrInu3btXHNu6dWs888wzcffdd0dZWVkUFhZmuDBbjRo1iiOPPDJefvnlrKfsda1bt97mDxAOP/zweOSRRzJalB9WrVoVTz75ZDz66KNZT8nMNddcE9ddd12cf/75EfHvP1xYtWpVjBs3rlYGU4cOHWL27NmxYcOGeP/996N169Zx3nnnRfv27bOelqkPX2F09erV0bp164rja9as2easE7XTBx98EOeee2689tpr8cc//nGnzi5FeJU89oBcLheXXXZZPProo/HHP/6x1v+H/JNyuVyUlZVlPWOv++IXvxhLly6NRYsWVbz16NEjBg0aFIsWLarVsRQRUVZWFi+++GKl/9nXFsccc8w2f/XAihUrol27dhktyg+TJk2KFi1aRP/+/bOekpmNGzdGnTqVf6tSWFhYa19W/EONGjWK1q1bx9q1a+Pxxx+PM888M+tJmWrfvn20atWq4hUlI/79/L/Zs2dHnz59MlxGPvgwll5++eV48sknd+myd2eYqsn69etj5cqVFR+/9tprsWjRomjWrFm0bds2w2V734gRI+Khhx6KX//619GkSZOKa4uLi4ujQYMGGa/bu2644Ybo169fHHjggbFu3bqYOnVqzJo1K/7whz9kPW2va9KkyTbPY2vUqFE0b968Vj6/7eqrr44BAwZE27ZtY82aNTFmzJh4//33a+Wfml911VXRp0+fGDt2bJx77rkxd+7cmDhxYkycODHraZkpLy+PSZMmxZAhQ6Ju3dr7v+oBAwbELbfcEm3bto1OnTrF888/H3fccUcMGzYs62mZePzxxyOXy8Vhhx0WK1eujGuuuSYOO+ywuPjii7Oetsft6PdZV155ZYwdOzYOPfTQOPTQQ2Ps2LHRsGHDuPDCCzNcvWfs6LH45z//Ga+//nrF3zX04R9ItWrV6jP59/192uPRpk2b+K//+q9YuHBh/Pa3v42tW7dW/L60WbNmUb9+/ap9k11/4T4+7umnn85FxDZvQ4YMyXraXre9xyEicpMmTcp62l43bNiwXLt27XL169fPfe5zn8t98YtfzD3xxBNZz8obtfllxc8777xc69atc/Xq1cu1adMmd8455+RKSkqynpWZ3/zmN7nOnTvnioqKch07dsxNnDgx60mZevzxx3MRkVu+fHnWUzL1/vvv50aOHJlr27Ztbp999skdfPDBuRtvvDFXVlaW9bRMPPzww7mDDz44V79+/VyrVq1yI0aMyL333ntZz9ordvT7rPLy8txNN92Ua9WqVa6oqCh3/PHH55YuXZrt6D1kR4/FpEmTtvv5m266KdPde8qnPR4fvrT69t6efvrpKn+Pglwul9u5jgMAAKgdPIcJAAAgQTABAAAkCCYAAIAEwQQAAJAgmAAAABIEEwAAQIJgAgAASBBMAAAACYIJAAAgQTABAAAkCCYAapwTTzwxrrzyyky+9zXXXBOnn356Jt8bgL2vbtYDAKhdhg4dGu+9915Mnz496ym75MYbb4zCwsKsZwCwlwgmANgJ++67b9YTANiLXJIHQKZOPPHEuOKKK+Ib3/hGNGvWLFq1ahWjR4+u+PyGDRvioosuisaNG0fr1q3jBz/4wTb3kcvl4rbbbouDDz44GjRoEF27do1f/epXFZ9/5513olWrVjF27NiKY88991zUr18/nnjiiSpvfffdd6OgoCBKSkp27RcLQI0jmADI3OTJk6NRo0bx3HPPxW233RY333xzzJw5MyL+/Zyhp59+OqZNmxZPPPFEzJo1KxYsWFDp67/5zW/GpEmTYvz48VFSUhJXXXVVDB48OGbPnh0REZ/73Ofipz/9aYwePTrmz58f69evj8GDB8ell14affv2rfLOxYsXR1FRURx22GHV94sHIK+5JA+AzHXp0iVuuummiIg49NBD4+67746nnnoqevfuHT/5yU/igQceiFNOOSUi/h1XBxxwQMXXbtiwIe6444744x//GL17946IiIMPPjjmzJkT9957b5xwwgkREXHaaafFV77ylRg0aFD07Nkz9tlnn7j11lt3aufixYujU6dOUbeu/30C1Bb+iw9A5rp06VLp49atW8eaNWvilVdeic2bN1eEUEREs2bNKp3hWbZsWWzatKkiqD60efPmOOqooyod+/73vx+dO3eOX/ziFzF//vzYZ599dmrnokWLolu3bjv1NQDUbIIJgMzVq1ev0scFBQVRXl4euVxuh19bXl4eERG/+93v4vOf/3ylzxUVFVX6+NVXX4233347ysvLY9WqVduE2o4sXrw4hg8fvlNfA0DNJpgAyFuHHHJI1KtXL5599tlo27ZtRESsXbs2VqxYUXGp3RFHHBFFRUXx+uuvVxzbns2bN8egQYPivPPOi44dO8bw4cNj6dKl0bJlyypt+eCDD+LFF1+Mrl277v4vDIAaQzABkLcaN24cw4cPj2uuuSaaN28eLVu2jBtvvDHq1PnoNYuaNGkSV199dVx11VVRXl4exx57bLz//vvx5z//ORo3bhxDhgyJiH///UmlpaXxox/9KBo3bhwzZsyI4cOHx29/+9sqbVm2bFl88MEHggmglhFMAOS122+/PdavXx9nnHFGNGnSJL7+9a9HaWlppdt897vfjRYtWsS4cePi1VdfjX333TeOPvrouOGGGyIiYtasWXHnnXfG008/HU2bNo2IiAcffDC6dOkS48ePj//5n/+J+++/Py6++OLkZYCLFi2Kdu3a+XuYAGqZglxVLhAHgM+40aNHx6xZs2LWrFnb/fxll10Wa9asiV/84hd7dxgAmfL3MAFARDz++ONx2223bXN806ZNsXDhwnjkkUfi1FNPzWAZAFlyhgkAPsWtt94ad911V5xxxhnxox/9aJtX9APgs00wAQAAJLgkDwAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAAS6mY9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9OrVK+6///6oU8efV+STzZs3R8OGDeOXv/xlnH322RXHR44cGYsWLYrZs2dnuI6quvzyy2P69OnxzDPPRPv27bOeQxVMnz49zj777CgsLKw4tnXr1igoKIg6depEWVlZpc+RP9q1axennHJK/PjHP644Nn78+BgzZky89dZbGS5jRw488MC47rrrYsSIERXHxowZE1OmTImXXnopw2X5ySV5Gdt///1j//333+HtfvSjH8WYMWMqPn777bfj1FNPjYcffjh69eq1JyeSUNWfXcS/X3b1pJNOiu7du8ekSZPEUh6qX79+dO/ePWbOnFkpmGbOnBlnnnlmhsuoilwuF5dffnlMmzYtZs2aJZZqkC9+8YuxdOnSSscuvvji6NixY1x77bViKY8dc8wx27x8/4oVK6Jdu3YZLaKqNm7cuM3vRQoLC72seIJgqiHatm1b6ePGjRtHRESHDh3igAMOyGISVfT222/HiSeeGG3bto3vf//78c4771R8rlWrVhku45NGjRoVX/7yl6NHjx7Ru3fvmDhxYrz++uvxta99Letp7MCIESPioYceil//+tfRpEmTiuedFRcXR4MGDTJex6dp0qTJNs81a9SoUTRv3txz0PLcVVddFX369ImxY8fGueeeG3Pnzo2JEyfGxIkTs57GDgwYMCBuueWWaNu2bcWrLt9xxx0xbNiwrKflJcEEe9gTTzwRK1eujJUrV24Tt66IzS/nnXde/OMf/4ibb745/va3v0Xnzp3j97//vT8trQE+fM7EiSeeWOn4pEmTYujQoXt/ENQCPXv2jGnTpsX1118fN998c7Rv3z7uvPPOGDRoUNbT2IG77rorvvWtb8Wll14aa9asiTZt2sRXv/rV+Pa3v531tLzkOUwAAAAJnkgBAACQIJgAAAASBBMAAECCYAIAAEgQTAAAAAmCCQAAIEEwAQAAJAgmAACABMEEAACQIJgAAAASBBMAAECCYAIAAEj4/wFtILMKzTjcVQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x1000 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "all_1 = np.ones((12, 1))  # 创建一个全1列向量，大小为12行1列\n",
    "sum_over_j = a_ij @ all_1  # 对列方向求和，结果为一列\n",
    "\n",
    "title = r'$\\sum_{j=1}^{m} a_{i,j}$'  # 设置图表标题，表示对j求和\n",
    "heatmap_sum(sum_over_j, i_array, j_array, title)  # 绘制部分求和结果的热力图"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
